// ts可以在你写好代码后进行类型校验
// ts还可以在你写代码的时候增加一些代码提示
import express from "express";
const app = express();
 
app.get("/", function (req, res) {
  // res.sen
});

// 非严格模式，可以有隐式any，严格模式不能有隐士any
function greet(person, date:any) {
  console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}
greet("Maddison", new Date());

function f1(){
  // "use strict";
  // f1.caller; //报错
  // f1.arguments; //报错
}
f1();

// 严格模式:
    // js中的严格模式----"use strict"命令，是es6增加的指令，添加了一些js规范
      /* 
        严格模式对正常的 JavaScript语义做了一些更改。
        首先，严格模式通过抛出错误来消除了一些原有静默错误。
        其次，严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷：有时候，相同的代码，严格模式可以比非严格模式下运行得更快。
        第三，严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。
      */
    //  ts中的严格模式，是一系列的校验规则，
    /* 
          noImplicitAny                     不允许变量或函数参数具有隐式any类型(没有给变量添加类型，也没有类型推断，会被ts设置成any类型，这个就是隐式any)
          noImplicitThis                    不允许this上下文隐式定义。
          strictNullChecks                  不允许出现null或undefined的可能性。strictPropertyInitialization      验证构造函数内部初始化前后已定义的属性。
          strictBindCallApply               对bind,call,apply更严格的类型检测。
          strictFunctionTypes               对函数参数进行严格逆变比较。
    */
        // 在config中设置strict为true，开启ts严格模式,上面的配置都会生效，也可以单独设置上面的某个配置项，单独设置的优先级更高，可以覆盖严格模式
        
        let a = 1
        a = null     //在非严格模式下，null和undefined可以被赋值给任何类型的变量，在严格模式下，null和undefined被赋值给其他类型的变量会报错
        console.log(a);
        
        